/** 
 * 一些常用的其他函数工具
 */

/** 
 * 根据公式进行计算对象里属性的值 
 * 不做数据，公式的过滤，传参时自行过滤
 * obj:object,formula:string
 */
export function computedObjectValue(obj,formula){
    const keys = Object.keys(obj);
    //防止脚本注入
    const fn = new Function(
        ...keys,
        `   
            let window,File,Blob,document;
            return ${formula};
        `,
    );
    return fn(...keys.map(item=>obj[item]));
}
/** 
 * 对象属性合并（浅合并） 
 * example
 *  const needMergeFiled = [ 
        ['name','name1'],
    ];
    mergeObjProperty(formData.form,clue,needMergeFiled);
 */
export function mergeObjProperty(target,fixedTarget,option={}){
    let mergeKeyList = [];  //需要合并的key
    let excludeKeyList = [];  //合并时需要排除的 key
    let mergeAll = false;  //是否合并fixed对象的所有key
    if(Array.isArray(option)){
        mergeKeyList = option;
    }else{
        mergeKeyList = option.mergeKeyList || [];
        excludeKeyList = option.excludeKeyList || [];
        mergeAll = !!option.mergeAll;
    }
    if(mergeAll){
        const mergeKeyMap = mergeKeyList.reduce((c,item)=>{
            const key = item[1] || item[0];
            c[key] = item[0];
            return c;
        },{});
        Object.keys(fixedTarget).forEach(item=>{
            if(excludeKeyList.includes(item)) return;
            if(mergeKeyMap[item]){
                target[mergeKeyMap[item]] = fixedTarget[item];
            }else{
                target[item] = fixedTarget[item];
            }
        });
        return;
    }else{
        mergeKeyList.forEach(item=>{
            if(item.length==1){
                target[item[0]] = fixedTarget[item[0]];
            }else{
                target[item[0]] = fixedTarget[item[1]];
            }
        });
    }
}
/**
 * 获取dict单个数据
 */
export function getDictItem(dictList,value,option={}){
    const { valueKey = 'value' } = option;
    return dictList.find(item=>{
        return item[valueKey] == value;
    });
}
/** 
 * 获取dict的value对应的label
 */
export function getDictItemLabel(target,value,option={}){
    const { valueKey = 'value',lebelKey='label',showValue=true } = option;
    let item = getDictItem(target,value,{valueKey:valueKey});
    if(item){
        return item[lebelKey];
    }else if(showValue){  //如果没找到item的化直接返回value
        return value;
    }else{
        return '';
    }
}
/** 
 * 深度复制一个对象 
 * 最简单的实现方式
 */
export function deepCopyObj(obj){
    return JSON.parse(JSON.stringify(obj));
}
/**
 * 删除数组指定元素列表
 * 会直接改变原数组
 * @param array:array
 * @param items:array
 */
export function deleteArrayItems(array,items){
    items.forEach(item => {
        array.splice(
            array.indexOf(item),
            1,
        );
    });
}
/** 
 * 展开树形list结构为一维list 
 * @param treeList:array
 * @param option:object
 */
export function unfoldTreeList(treeList,option={}){
    const { 
        childsKey='children',  //需要获取子元素的 key
        setParentKey='parentId',  //需要赋值的父元素 key 
        getParentKey='id', //获取父元素 key
        forEachFn=null,  //循环时的回调
    } = option;
    const deptOneList = [];
    const deepForEach = (target)=>{
        deptOneList.push(target);
        forEachFn && forEachFn(target);
        if(target[childsKey]){
            target[childsKey].forEach(item_=>{
                item_[setParentKey] = target[getParentKey];
                deepForEach(item_);
            });
        }
    }
    treeList.forEach(item=>{
        deepForEach(item);
    });
    return deptOneList;
}
/** 
 * 设置element表单中lebel的最大宽度
 */
export function setupFormLabelWidth(refEl){
    if(!refEl) return;
    let widthList = [];
    const labelElList = refEl.querySelectorAll('label');
    labelElList.forEach(item=>{
        item.style.width = 'fit-content';
        widthList.push(item.clientWidth + 1);
    });
    labelElList.forEach(item=>{
        item.style.width = `${Math.max(...widthList)}px`;
    });
}
/** 
 * 将数字格式化为千分位字符
 */
export function toThousandsString(num) {
    return String(num).replace(/(\d{1,3})(?=(\d{3})+(?:$|\.))/g, '$1,');
}
/**
 * copy value
 * 数据粘贴板复制 
 */
export function copyValue(value){
    var save = function (e){
        e.clipboardData.setData('text/plain',value);
        e.preventDefault();//阻止默认行为
    }
    document.addEventListener('copy',save);
    document.execCommand("copy");
    document.removeEventListener('copy',save);
}
/**
 * 数字四舍五入
 * value:number
 * length:number
 */
export function numberToFixed(value,length){
    return Number(Number.prototype.toFixed.call(value,length));
}
/**
 * 判断文件是否可预览
 * @param {*} fileName 
 */
export function getFilePreviewState(fileName){  
    let types = fileName.split('.');
    let type = types[types.length - 1];
    return 'png|jpg|pdf'.indexOf(type) !== -1;
}
/** (基础限制)限制输入 */
/** 不允许输入小数 */
export function limitInput(data,key){
    if(!data[key] && data[key] !== 0) return;
    const number = Number(data[key]);
    data[key] = numberToFixed(number,0);
}
/** 不允许输入负数*/
export function limitInput_1(data,key){
    if(!data[key] && data[key] !== 0) return;
    const number = Number(data[key]);
    if(number<0){
        data[key] = Math.abs(number);
    }
}
/** 
 * 根据配置信息初始化对象
 * 如果 option 有该属性则使用该属性，没有则初始化
 * configMap example
 *  const configMap = {
        //配置信息，初始化时使用
        open: {
            oldValue: false,
        },
        title: {
            oldValue: '入库',
        },
        afterTitle: {
            oldValue: '',
        },
        isShow: {
            //是否只是展示
            oldValue: false,
        },
    };
 */
export function initDataByConfig(data={},configOption = {},configMap={},) {
    configOption = configOption || {};
    Object.keys(configMap).forEach(key => {
        //初始化一些配置信息
        if (configOption.hasOwnProperty(key)) {
            data[key] = configOption[key];
        } else {
            if (typeof configMap[key].oldValue == 'function') {
                data[key] = configMap[key].oldValue();
            } else {
                data[key] = configMap[key].oldValue;
            }
        }
    });
}